/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package DAO;

import bean.Autor;
import bean.Coordenacao;
import bean.GrupoDePesquisa;
import bean.Instituicao;
import java.io.Serializable;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author fernando
 */
public class GrupoDePesquisaDAO implements Serializable {

    private Conexao conexao;
    private PreparedStatement ps;
    private boolean sucess = false;

    public GrupoDePesquisaDAO() {
        this.conexao = new ConexaoPostgres();
    }

    public boolean cadastrar(GrupoDePesquisa gp) {
        sucess = false;

        try {

            ps = conexao.getConnection().prepareStatement("INSERT INTO grupo_de_pesquisa( instituicao_id, link_dgp, possui_projeto_institucional, possui_grupo_pos, nome_programa_pos, pertence_args, contato, email, telefone, site, endereco, nome) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )");
            ps.setInt(1, gp.getInstituicao().getId());
            ps.setString(2, gp.getLinkDGP());
            ps.setBoolean(3, gp.isPossuiProjetosInstituicionais());
            ps.setBoolean(4, gp.isGrupoPosGraduacao());
            ps.setString(5, gp.getNomeProgramaPosGraduacao());
            ps.setBoolean(6, gp.isGrupoRelacinadoARGS());
            ps.setString(7, gp.getContato());
            ps.setString(8, gp.getEmail());
            ps.setString(9, gp.getTelefone());
            ps.setString(10, gp.getSite());
            ps.setString(11, gp.getEndereco());
            ps.setString(12, gp.getNomeDoGrupo());
            ps.executeUpdate();
            conexao.closeConnection();

            gp.setId(this.buscarId(gp));
            Iterator i;
            if (!gp.getCoordenadores().isEmpty()) {
                i = gp.getCoordenadores().iterator();
                while (i.hasNext()) {
                    Coordenacao e = (Coordenacao) i.next();
                    ps = conexao.getConnection().prepareStatement("INSERT INTO gp_coordenadores( id_gp, id_coordenador, data_inicio, data_fim) VALUES (?, ?, ?, ?)");
                    ps.setInt(1, gp.getId());
                    ps.setInt(2, e.getCoordenador().getId());
                    Date data = new Date(e.getDataInicio().getTime());
                    ps.setDate(3, data);
                    data = new Date(e.getDataFim().getTime());
                    ps.setDate(4, data);

                    ps.executeUpdate();
                    conexao.closeConnection();

                }


            }

            if (!gp.getLinhasDePesquisa().isEmpty()) {
                i = gp.getLinhasDePesquisa().iterator();
                while (i.hasNext()) {
                    String linhaDePesquisa = (String) i.next();
                    ps = conexao.getConnection().prepareStatement("INSERT INTO gp_linhapesquisa(id_gp, linha_pesquisa) VALUES (?, ?)");
                    ps.setInt(1, gp.getId());
                    ps.setString(2, linhaDePesquisa);

                    ps.executeUpdate();
                    conexao.closeConnection();

                }
            }

            if (!gp.getParceiras().isEmpty()) {
                i = gp.getParceiras().iterator();
                while (i.hasNext()) {
                    Instituicao inst = (Instituicao) i.next();
                    ps = conexao.getConnection().prepareStatement("INSERT INTO gp_parceira(id_gp, id_parceira) VALUES (?, ?)");
                    ps.setInt(1, gp.getId());
                    ps.setInt(2, inst.getId());

                    ps.executeUpdate();
                    conexao.closeConnection();

                }
            }

            if (!gp.getPesquisadores().isEmpty()) {
                i = gp.getPesquisadores().iterator();
                while (i.hasNext()) {
                    Autor pesq = (Autor) i.next();
                    ps = conexao.getConnection().prepareStatement("INSERT INTO gp_pesquisador(id_gp, id_pesquisador) VALUES (?, ?)");
                    ps.setInt(1, gp.getId());
                    ps.setInt(2, pesq.getId());

                    ps.executeUpdate();
                    conexao.closeConnection();

                }
            }



            sucess = true;
        } catch (SQLException ex) {
            conexao.closeConnection();
            Logger.getLogger(GrupoDePesquisaDAO.class.getName()).log(Level.SEVERE, null, ex);
            return sucess;
        }

        conexao.closeConnection();
        return sucess;
    }

    public int buscarId(GrupoDePesquisa gp) {
        int id = 0;
        try {

            ps = conexao.getConnection().prepareStatement("SELECT id FROM grupo_de_pesquisa WHERE instituicao_id = ? AND link_dgp = ? AND possui_projeto_institucional = ? AND possui_grupo_pos = ? AND  nome_programa_pos = ? AND pertence_args = ? AND contato = ? AND email = ? AND telefone = ? AND site = ? AND endereco = ? AND nome = ? ");
            ps.setInt(1, gp.getInstituicao().getId());
            ps.setString(2, gp.getLinkDGP());
            ps.setBoolean(3, gp.isPossuiProjetosInstituicionais());
            ps.setBoolean(4, gp.isGrupoPosGraduacao());
            ps.setString(5, gp.getNomeProgramaPosGraduacao());
            ps.setBoolean(6, gp.isGrupoRelacinadoARGS());
            ps.setString(7, gp.getContato());
            ps.setString(8, gp.getEmail());
            ps.setString(9, gp.getTelefone());
            ps.setString(10, gp.getSite());
            ps.setString(11, gp.getEndereco());
            ps.setString(12, gp.getNomeDoGrupo());

            ResultSet rs = ps.executeQuery();
            conexao.closeConnection();
            while (rs.next()) {
                id = rs.getInt("id");

            }
        } catch (SQLException ex) {
            Logger.getLogger(GrupoDePesquisaDAO.class.getName()).log(Level.SEVERE, null, ex);
        }

        return id;
    }

    public boolean alterar(GrupoDePesquisa gp) {
        boolean resultado = false;

        try {
            ps = conexao.getConnection().prepareStatement("UPDATE grupo_de_pesquisa SET instituicao_id=?, link_dgp=?, possui_projeto_institucional=?, possui_grupo_pos=?, nome_programa_pos=?, pertence_args=?, contato=?, email=?, telefone=?, site=?, endereco=?, nome = ? WHERE id = ? ");
            ps.setInt(1, gp.getInstituicao().getId());
            ps.setString(2, gp.getLinkDGP());
            ps.setBoolean(3, gp.isPossuiProjetosInstituicionais());
            ps.setBoolean(4, gp.isGrupoPosGraduacao());
            ps.setString(5, gp.getNomeProgramaPosGraduacao());
            ps.setBoolean(6, gp.isGrupoRelacinadoARGS());
            ps.setString(7, gp.getContato());
            ps.setString(8, gp.getEmail());
            ps.setString(9, gp.getTelefone());
            ps.setString(10, gp.getSite());
            ps.setString(11, gp.getEndereco());
            ps.setString(12, gp.getNomeDoGrupo());
            ps.setInt(13, gp.getId());
            ps.executeUpdate();
            conexao.closeConnection();

            ps = conexao.getConnection().prepareStatement("DELETE FROM gp_coordenadores WHERE id_gp = ? ");
            ps.setInt(1, gp.getId());
            ps.executeUpdate();
            conexao.closeConnection();

            Iterator i;
            if (!gp.getCoordenadores().isEmpty()) {
                i = gp.getCoordenadores().iterator();
                while (i.hasNext()) {
                    Coordenacao e = (Coordenacao) i.next();
                    ps = conexao.getConnection().prepareStatement("INSERT INTO gp_coordenadores( id_gp, id_coordenador, data_inicio, data_fim) VALUES (?, ?, ?, ?)");
                    ps.setInt(1, gp.getId());
                    ps.setInt(2, e.getCoordenador().getId());
                    Date data = new Date(e.getDataInicio().getTime());
                    ps.setDate(3, data);

                    data = new Date(e.getDataFim().getTime());
                    ps.setDate(4, data);



                    ps.executeUpdate();
                    conexao.closeConnection();

                }
            }

            ps = conexao.getConnection().prepareStatement("DELETE FROM gp_linhapesquisa WHERE id_gp = ? ");
            ps.setInt(1, gp.getId());
            ps.executeUpdate();
            conexao.closeConnection();

            if (!gp.getLinhasDePesquisa().isEmpty()) {
                i = gp.getLinhasDePesquisa().iterator();
                while (i.hasNext()) {
                    String linhaDePesquisa = (String) i.next();
                    ps = conexao.getConnection().prepareStatement("INSERT INTO gp_linhapesquisa(id_gp, linha_pesquisa) VALUES (?, ?)");
                    ps.setInt(1, gp.getId());
                    ps.setString(2, linhaDePesquisa);

                    ps.executeUpdate();
                    conexao.closeConnection();

                }
            }

            ps = conexao.getConnection().prepareStatement("DELETE FROM gp_parceira WHERE id_gp = ? ");
            ps.setInt(1, gp.getId());
            ps.executeUpdate();
            conexao.closeConnection();



            if (!gp.getParceiras().isEmpty()) {
                i = gp.getParceiras().iterator();
                while (i.hasNext()) {
                    Instituicao inst = (Instituicao) i.next();
                    ps = conexao.getConnection().prepareStatement("INSERT INTO gp_parceira(id_gp, id_parceira) VALUES (?, ?)");
                    ps.setInt(1, gp.getId());
                    ps.setInt(2, inst.getId());

                    ps.executeUpdate();
                    conexao.closeConnection();

                }
            }

            ps = conexao.getConnection().prepareStatement("DELETE FROM gp_pesquisador WHERE id_gp = ? ");
            ps.setInt(1, gp.getId());
            ps.executeUpdate();
            conexao.closeConnection();


            if (!gp.getPesquisadores().isEmpty()) {
                i = gp.getPesquisadores().iterator();
                while (i.hasNext()) {
                    Autor pesq = (Autor) i.next();
                    ps = conexao.getConnection().prepareStatement("INSERT INTO gp_pesquisador(id_gp, id_pesquisador) VALUES (?, ?)");
                    ps.setInt(1, gp.getId());
                    ps.setInt(2, pesq.getId());

                    ps.executeUpdate();
                    conexao.closeConnection();

                }
            }

            resultado = true;
        } catch (SQLException ex) {
            Logger.getLogger(GrupoDePesquisaDAO.class.getName()).log(Level.SEVERE, null, ex);
        }

        return resultado;
    }

    public ArrayList<GrupoDePesquisa> listar() {
        ArrayList<GrupoDePesquisa> pg = new ArrayList<GrupoDePesquisa>();

        try {

            ps = conexao.getConnection().prepareStatement("SELECT nome, instituicao_id, id FROM grupo_de_pesquisa;");
            ResultSet rs = ps.executeQuery();
            conexao.closeConnection();
            while (rs.next()) {
                GrupoDePesquisa gp = new GrupoDePesquisa();
                gp.setId(rs.getInt("id"));
                gp.setNomeDoGrupo((rs.getString("nome")));
                gp.setInstituicao(new InstituicaoDao().consultaInstituicao(rs.getInt("instituicao_id")));
                pg.add(gp);
            }
        } catch (SQLException ex) {
            Logger.getLogger(CursoDAO.class.getName()).log(Level.SEVERE, null, ex);
        }


        return pg;

    }

    public ArrayList<Coordenacao> buscarCoodenadores(int id) {
        ArrayList<Coordenacao> coordenadores = new ArrayList<Coordenacao>();
        try {
            ps = conexao.getConnection().prepareStatement("SELECT id_coordenador, data_inicio, data_fim FROM gp_coordenadores WHERE id_gp = ? ");
            ps.setInt(1, id);
            ResultSet rs = ps.executeQuery();
            conexao.closeConnection();
            while (rs.next()) {
                Coordenacao c = new Coordenacao();
                c.setCoordenador(new AutorDao().consultaAutor(rs.getInt("id_coordenador")));
                c.setDataFim(rs.getDate("data_fim"));
                c.setDataInicio(rs.getDate("data_inicio"));

                coordenadores.add(c);
            }

        } catch (SQLException ex) {
            Logger.getLogger(GrupoDePesquisaDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        return coordenadores;
    }

    public ArrayList<String> buscarLinhasDePesquisa(int id) {
        ArrayList<String> linhasDePesquisa = new ArrayList<String>();

        try {

            ps = conexao.getConnection().prepareStatement("SELECT linha_pesquisa FROM gp_linhapesquisa WHERE id_gp = ?;");
            ps.setInt(1, id);
            ResultSet rs = ps.executeQuery();
            conexao.closeConnection();
            while (rs.next()) {

                String linha;
                linha = rs.getString("linha_pesquisa");
                linhasDePesquisa.add(linha);

            }
        } catch (SQLException ex) {
            Logger.getLogger(GrupoDePesquisaDAO.class.getName()).log(Level.SEVERE, null, ex);
        }


        return linhasDePesquisa;

    }

    public ArrayList<Instituicao> buscarParceiras(int id) {
        ArrayList<Instituicao> parceiras = new ArrayList<Instituicao>();

        try {

            ps = conexao.getConnection().prepareStatement("SELECT id_parceira FROM gp_parceira WHERE id_gp = ?;");
            ps.setInt(1, id);
            ResultSet rs = ps.executeQuery();
            conexao.closeConnection();
            while (rs.next()) {

                Instituicao i;
                i = new InstituicaoDao().consultaInstituicao(rs.getInt("id_parceira"));
                parceiras.add(i);

            }
        } catch (SQLException ex) {
            Logger.getLogger(GrupoDePesquisaDAO.class.getName()).log(Level.SEVERE, null, ex);
        }


        return parceiras;

    }

    public ArrayList<Autor> buscarPesquisadores(int id) {
        ArrayList<Autor> pesquisadores = new ArrayList<Autor>();
        try {
            ps = conexao.getConnection().prepareStatement("SELECT id_pesquisador FROM gp_pesquisador WHERE id_gp = ? ");
            ps.setInt(1, id);
            ResultSet rs = ps.executeQuery();
            AutorDao ad = new AutorDao();
            while (rs.next()) {
                Autor professor = ad.consultaAutor(rs.getInt("id_pesquisador"));
                pesquisadores.add(professor);
            }

        } catch (SQLException ex) {
            Logger.getLogger(GrupoDePesquisaDAO.class.getName()).log(Level.SEVERE, null, ex);
        }


        return pesquisadores;
    }

    public GrupoDePesquisa buscar(int id) {
        GrupoDePesquisa gp = new GrupoDePesquisa();

        try {

            ps = conexao.getConnection().prepareStatement("SELECT instituicao_id, link_dgp, possui_projeto_institucional, possui_grupo_pos, nome_programa_pos, pertence_args, contato, email, telefone, site, endereco, nome FROM grupo_de_pesquisa WHERE id = ?");
            ps.setInt(1, id);
            ResultSet rs = ps.executeQuery();
            conexao.closeConnection();
            while (rs.next()) {

                gp.setId(id);
                gp.setNomeDoGrupo((rs.getString("nome")));
                gp.setInstituicao(new InstituicaoDao().consultaInstituicao(rs.getInt("instituicao_id")));
                gp.setLinkDGP(rs.getString("link_dgp"));
                gp.setPossuiProjetosInstituicionais(rs.getBoolean("possui_projeto_institucional"));
                gp.setGrupoPosGraduacao(rs.getBoolean("possui_grupo_pos"));
                gp.setNomeProgramaPosGraduacao(rs.getString("nome_programa_pos"));
                gp.setGrupoRelacinadoARGS(rs.getBoolean("pertence_args"));
                gp.setContato(rs.getString("contato"));
                gp.setEmail(rs.getString("email"));
                gp.setTelefone(rs.getString("telefone"));
                gp.setSite(rs.getString("site"));
                gp.setEndereco(rs.getString("endereco"));
                gp.setCoordenadores(this.buscarCoodenadores(id));
                gp.setLinhasDePesquisa(this.buscarLinhasDePesquisa(id));
                gp.setPesquisadores(this.buscarPesquisadores(id));
                gp.setParceiras(this.buscarParceiras(id));


            }
        } catch (SQLException ex) {
            Logger.getLogger(GrupoDePesquisaDAO.class.getName()).log(Level.SEVERE, null, ex);
        }


        return gp;

    }
}
